﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIIV.Data;
using System.Text.RegularExpressions;

namespace SIIV.View.Desktop
{
    public partial class frmUsuarios : frmBase
    {
        int idUsuarioSeleccionado;

        public frmUsuarios()
        {
            InitializeComponent();
        }

        private void frmUsuarios_Load(object sender, EventArgs e)
        {
            datosUsuario.Text = "Nuevo Usuario";
            btnCancelar.Visible = false;
            cargarRoles(); 
            cargarUsuarios();
            dtFechaNacimiento.Value = DateTime.Today;
        }

        private void cargarRoles()
        {
            comboRoles.DataSource = Enum.GetValues(typeof(SIIV.Business.Roles));
            comboBusquedaRol.Items.Add("[TODOS]");
            foreach (SIIV.Business.Roles rol in Enum.GetValues(typeof(SIIV.Business.Roles)))
            {
                comboBusquedaRol.Items.Add(rol.ToString());
            }
            
            comboBusquedaRol.SelectedIndex = 0;
        }

        private void cargarUsuarios()
        {
            dgvUsuarios.Rows.Clear();
            List<Usuario> usuarios = Usuarios.ObtenerUsuarios(
                txtBusquedaUsuario.Text, 
                txtBusquedaNombreApellido.Text, 
                txtBusquedaEmail.Text, 
                txtBusquedaNroDocumento.Text.Equals(string.Empty) ? new Nullable<long>() : long.Parse(txtBusquedaNroDocumento.Text), 
                comboBusquedaRol.SelectedIndex.Equals(0) ? new Nullable<SIIV.Business.Roles>() : (SIIV.Business.Roles)comboBusquedaRol.SelectedIndex);
            foreach (Usuario u in usuarios)
            {
                dgvUsuarios.Rows.Add(u.Username, u.Password, u.Email, u.Nombre, u.Apellido, u.NroDocumento, u.FechaNacimiento, u.Rol.Nombre, u.IdUsuario);
                
                dgvUsuarios.Rows[dgvUsuarios.Rows.Count - 1].ContextMenuStrip = contextMenuStrip1;
            }
            dgvUsuarios.ClearSelection();
        }

        private void dgvUsuarios_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (!e.RowIndex.Equals(-1))
            {
                DataGridViewRow fila = dgvUsuarios.Rows[e.RowIndex];
                cargarDatosUsuario(fila);
            }
        }

        private void cargarDatosUsuario(DataGridViewRow fila)
        {
            datosUsuario.Text = "Editar Usuario: " + fila.Cells[4].Value.ToString() + ", " + fila.Cells[3].Value.ToString();
            txtApellido.Text = fila.Cells[4].Value.ToString();
            txtContraseña.Text = fila.Cells[1].Value.ToString();
            txtEmail.Text = fila.Cells[2].Value.ToString();
            txtNombre.Text = fila.Cells[3].Value.ToString();
            txtNroDocumento.Text = fila.Cells[5].Value.ToString();
            txtUsername.Text = fila.Cells[0].Value.ToString();
            dtFechaNacimiento.Value = DateTime.Parse(fila.Cells[6].Value.ToString());
            comboRoles.SelectedIndex = (int)((SIIV.Business.Roles)Enum.Parse(typeof(SIIV.Business.Roles), fila.Cells[7].Value.ToString())) - 1;
            comboRoles.Enabled = false;
            idUsuarioSeleccionado = Convert.ToInt32(fila.Cells[8].Value);
            btnCancelar.Visible = true;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {

            if (MessageBox.Show("¿Desea guardar los datos para el Usuario " + txtNombre.Text + "?", "Confirmación Datos", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
            {
                errorProvider1.Clear();
                if (txtUsername.Text == string.Empty)
                {
                    errorProvider1.SetError(txtUsername, "Debe ingresar el nombre del Usuario.");
                }

                else if (txtContraseña.Text == string.Empty)
                {
                    errorProvider1.SetError(txtContraseña, "Debe ingresar la contraseña.");
                }
                else if (txtEmail.Text == string.Empty)
                {
                    errorProvider1.SetError(txtEmail, "Debe ingresar una dirección de correo.");
                }
                else if (!ValidaEmail(txtEmail.Text))
                {
                    errorProvider1.SetError(txtEmail, "E-mail incorrecto.");
                }

                else if (txtNombre.Text == string.Empty)
                {
                    errorProvider1.SetError(txtNombre, "Debe ingresar el nombre.");
                }

                else if (ValidarNumero(txtNombre.Text))
                {
                    errorProvider1.SetError(txtNombre, "Ingreso incorrectos, debe ingresar letras.");
                }

                else if (txtApellido.Text == string.Empty)
                {
                    errorProvider1.SetError(txtApellido, "Debe ingresar el apellido.");
                }

                else if (ValidarNumero(txtApellido.Text))
                {
                    errorProvider1.SetError(txtApellido, "Ingreso incorrectos, debe ingresar letras.");
                }

                else if (txtNroDocumento.Text == string.Empty)
                {
                    errorProvider1.SetError(txtNroDocumento, "Debe ingresar el nro de documento.");
                }
                else if (!ValidarNroDocumento(txtNroDocumento.Text))
                {
                    errorProvider1.SetError(txtNroDocumento, "Debe ingresar un documento válido.");
                }
                else
                {
                    try
                    {
                        if (idUsuarioSeleccionado.Equals(0))
                        {
                            Usuarios.VerificarExisteUsuario(txtUsername.Text);
                            Usuarios.CrearUsuario(txtApellido.Text, txtContraseña.Text, txtEmail.Text, txtNombre.Text, long.Parse(txtNroDocumento.Text), txtUsername.Text, dtFechaNacimiento.Value, (SIIV.Business.Roles)comboRoles.SelectedIndex + 1);
                        }
                        else
                        {
                            /* Usuarios.VerificarModUsuario(idUsuarioSeleccionado,txtUsername.Text);*/
                            Usuarios.ActualizarUsuario(idUsuarioSeleccionado, txtApellido.Text, txtContraseña.Text, txtEmail.Text, txtNombre.Text, long.Parse(txtNroDocumento.Text), txtUsername.Text, dtFechaNacimiento.Value, (SIIV.Business.Roles)comboRoles.SelectedIndex + 1);
                        }
                        cargarUsuarios();
                        reiniciarFormulario();
                    }
                    catch (Exception ex)
                    {
                        MostrarError(ex.Message);
                    }
                }
            }
        }

        private bool ValidarNumero(string strNumero)
        {
            int intNumero = 0;

            if (int.TryParse(strNumero, out intNumero))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private bool ValidarNroDocumento(string strNumero)
        {
            int intNumero = 0;
            if (int.TryParse(strNumero, out intNumero))
            {
                if (intNumero > 1000000)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        


        private Boolean ValidaEmail(String email)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
               
       
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            reiniciarFormulario();
        }

        private void reiniciarFormulario()
        {
            txtApellido.Text = string.Empty;
            txtContraseña.Text = string.Empty;
            txtEmail.Text = string.Empty;
            txtNombre.Text = string.Empty;
            txtNroDocumento.Text = string.Empty;
            txtUsername.Text = string.Empty;
            dtFechaNacimiento.Value = dtFechaNacimiento.MinDate;
            comboRoles.SelectedIndex = 0;
            datosUsuario.Text = "Nuevo Usuario";
            btnCancelar.Visible = false;
            idUsuarioSeleccionado = 0;
            dgvUsuarios.ClearSelection();
            comboRoles.Enabled = true;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            cargarUsuarios();
        }

        private void modificarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Int32 fila = dgvUsuarios.Rows.GetFirstRow(DataGridViewElementStates.Selected);
            cargarDatosUsuario(dgvUsuarios.Rows[fila]);
        }

        private void dgvUsuarios_MouseDown(object sender, MouseEventArgs e)
        {
            dgvUsuarios.ClearSelection();
            if (!dgvUsuarios.HitTest(e.X, e.Y).RowIndex.Equals(-1))
            {
                dgvUsuarios.Rows[dgvUsuarios.HitTest(e.X, e.Y).RowIndex].Selected = true;
            }
        }

        private void eliminarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Int32 fila = dgvUsuarios.Rows.GetFirstRow(DataGridViewElementStates.Selected);
            try
            {
                if (MessageBox.Show("¿Desea eliminar el usuario " + dgvUsuarios.Rows[fila].Cells[4].Value.ToString() + "?", "Confirmación ", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    Usuarios.EliminarUsuario(Convert.ToInt32(dgvUsuarios.Rows[fila].Cells[8].Value));
                    cargarUsuarios();
                    reiniciarFormulario();
                }
                
            }
            catch (Exception ex)
            {
                MostrarError(ex.Message);
            }
        }

        private void dgvUsuarios_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (!e.RowIndex.Equals(-1))
            {
                dgvUsuarios.Rows[e.RowIndex].Selected = true;
            }
        }

            
        private void txtBusquedaNroDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Permitimos solo números y  el símbolo .
            if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != 8)
                e.Handled = true; 
        }

        private void txtNroDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Permitimos solo números y  el símbolo .
            if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != 8)
                e.Handled = true; 
        }
                
    }
}
